//package cn.sunyblog.tool.threadpool.example;
//
//import cn.sunyblog.tool.threadpool.DynamicThreadPoolExecutor;
//import cn.sunyblog.tool.threadpool.config.DynamicThreadPoolConfig;
//import cn.sunyblog.tool.threadpool.monitor.ThreadPoolMetrics;
//import cn.sunyblog.tool.threadpool.web.ThreadPoolWebController;
//import org.springframework.boot.SpringApplication;
//import org.springframework.boot.autoconfigure.SpringBootApplication;
//import org.springframework.context.ConfigurableApplicationContext;
//
//import java.util.concurrent.TimeUnit;
//import java.util.concurrent.atomic.AtomicInteger;
//
///**
// * 带Web界面的动态线程池示例
// * 演示如何使用动态线程池以及Web监控界面
// *
// * @author sunyblog
// */
//@SpringBootApplication
//public class DynamicThreadPoolWebExample {
//
//    private static DynamicThreadPoolExecutor executor;
//    private static final AtomicInteger taskCounter = new AtomicInteger(0);
//
//    public static void main(String[] args) throws InterruptedException {
//        // 启动Spring Boot应用
//        ConfigurableApplicationContext context = SpringApplication.run(DynamicThreadPoolWebExample.class, args);
//
//        System.out.println("\n=== 动态线程池Web监控示例启动 ===");
//        System.out.println("Web监控界面: http://localhost:8080/threadpool/monitor");
//        System.out.println("========================================\n");
//
//        // 创建动态线程池配置
//        DynamicThreadPoolConfig config = new DynamicThreadPoolConfig();
//        config.setThreadPoolName("WebExamplePool");
//        config.setCorePoolSize(2);
//        config.setMaximumPoolSize(8);
//        config.setQueueCapacity(15);
//        config.setKeepAliveTime(60);
//        config.setMonitorInterval(5); // 5秒监控一次
//        config.setEnableAutoAdjustment(true);
//        config.setEnableMetricsLogging(true);
//
//        // 创建动态线程池
//        executor = new DynamicThreadPoolExecutor(config);
//
//        // 注册到Web控制器
//        ThreadPoolWebController.registerThreadPool("WebExamplePool", executor);
//
//        // 启动监控数据收集线程
//        startMetricsCollection();
//
//        System.out.println("初始配置: " + config);
//
//        // 等待一段时间让用户访问Web界面
//        System.out.println("\n请访问 http://localhost:8080/threadpool/monitor 查看监控界面");
//        System.out.println("5秒后开始执行测试场景...\n");
//        Thread.sleep(5000);
//
//        // 模拟不同的负载场景
//        simulateIntensiveLoadScenarios();
//
//        // 保持应用运行以便查看Web界面
//        System.out.println("\n=== 测试完成，Web监控界面仍可访问 ===");
//        System.out.println("按 Ctrl+C 退出程序");
//
//        // 添加关闭钩子
//        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
//            System.out.println("\n正在关闭线程池...");
//            executor.shutdown();
//            try {
//                if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
//                    executor.shutdownNow();
//                }
//            } catch (InterruptedException e) {
//                executor.shutdownNow();
//                Thread.currentThread().interrupt();
//            }
//            context.close();
//            System.out.println("程序已退出");
//        }));
//
//        // 保持主线程运行
//        Thread.currentThread().join();
//    }
//
//    /**
//     * 启动指标收集
//     */
//    private static void startMetricsCollection() {
//        Thread metricsThread = new Thread(() -> {
//            while (!Thread.currentThread().isInterrupted()) {
//                try {
//                    ThreadPoolMetrics metrics = executor.getCurrentMetrics();
//                    ThreadPoolWebController.addMetricsHistory("WebExamplePool", metrics);
//                    Thread.sleep(2000); // 每2秒收集一次指标
//                } catch (InterruptedException e) {
//                    Thread.currentThread().interrupt();
//                    break;
//                }
//            }
//        });
//        metricsThread.setDaemon(true);
//        metricsThread.start();
//    }
//
//    /**
//     * 模拟高强度负载场景
//     */
//    private static void simulateIntensiveLoadScenarios() throws InterruptedException {
//
//        // 场景1: 预热阶段 - 少量任务
//        System.out.println("\n--- 场景1: 预热阶段 ---");
//        submitTasksWithRejectionHandling(10, 100, "预热任务");
//        Thread.sleep(8000);
//        printCurrentStatus();
//
//        // 场景2: 逐步增压 - 中等负载
//        System.out.println("\n--- 场景2: 逐步增压 ---");
//        submitTasksWithRejectionHandling(25, 150, "增压任务");
//        Thread.sleep(10000);
//        printCurrentStatus();
//
//        // 场景3: 高负载冲击 - 大量任务
//        System.out.println("\n--- 场景3: 高负载冲击 ---");
//        submitTasksWithRejectionHandling(60, 200, "高负载任务");
//        Thread.sleep(12000);
//        printCurrentStatus();
//
//        // 场景4: 极限压力测试 - 超大量任务
//        System.out.println("\n--- 场景4: 极限压力测试 (预期会有任务被拒绝) ---");
//        submitTasksWithRejectionHandling(120, 300, "极限压力任务");
//        Thread.sleep(15000);
//        printCurrentStatus();
//
//        // 场景5: 连续冲击波 - 多轮突发任务
//        System.out.println("\n--- 场景5: 连续冲击波测试 ---");
//        for (int wave = 1; wave <= 6; wave++) {
//            System.out.println(String.format("第 %d 波冲击 - 提交 40 个任务", wave));
//            submitTasksWithRejectionHandling(40, 100, "冲击波-" + wave);
//            Thread.sleep(2000); // 短间隔
//        }
//        Thread.sleep(20000);
//        printCurrentStatus();
//
//        // 场景6: 超高并发测试 - 瞬间大量任务
//        System.out.println("\n--- 场景6: 超高并发测试 (瞬间提交200个任务) ---");
//        submitTasksWithRejectionHandling(200, 250, "超高并发任务");
//        Thread.sleep(25000);
//        printCurrentStatus();
//
//        // 场景7: 持续高压 - 长时间高负载
//        System.out.println("\n--- 场景7: 持续高压测试 ---");
//        for (int round = 1; round <= 8; round++) {
//            System.out.println(String.format("持续高压第 %d 轮", round));
//            submitTasksWithRejectionHandling(30, 150, "持续高压-" + round);
//            Thread.sleep(3000);
//        }
//        Thread.sleep(20000);
//        printCurrentStatus();
//
//        // 场景8: 混合负载模式
//        System.out.println("\n--- 场景8: 混合负载模式 ---");
//        // 快速任务
//        submitTasksWithRejectionHandling(50, 50, "快速任务");
//        Thread.sleep(1000);
//        // 中等任务
//        submitTasksWithRejectionHandling(30, 200, "中等任务");
//        Thread.sleep(1000);
//        // 慢速任务
//        submitTasksWithRejectionHandling(20, 500, "慢速任务");
//        Thread.sleep(25000);
//        printCurrentStatus();
//
//        // 场景9: 负载下降测试
//        System.out.println("\n--- 场景9: 负载下降测试 ---");
//        submitTasksWithRejectionHandling(5, 300, "负载下降任务");
//        Thread.sleep(30000); // 等待较长时间观察缩容
//        printCurrentStatus();
//
//        // 场景10: 最终压力测试
//        System.out.println("\n--- 场景10: 最终压力测试 (预期大量拒绝) ---");
//        submitTasksWithRejectionHandling(300, 400, "最终压力任务");
//        Thread.sleep(30000);
//        printCurrentStatus();
//
//        System.out.println("\n=== 所有测试场景完成 ===");
//    }
//
//    /**
//     * 提交任务并处理拒绝异常
//     */
//    private static void submitTasksWithRejectionHandling(int taskCount, long taskDurationMs, String taskType) {
//        System.out.println(String.format("提交 %d 个 %s，每个任务耗时 %dms", taskCount, taskType, taskDurationMs));
//
//        int rejectedCount = 0;
//        int successCount = 0;
//
//        for (int i = 0; i < taskCount; i++) {
//            final int taskId = taskCounter.incrementAndGet();
//            try {
//                executor.execute(() -> {
//                    try {
//                        System.out.println(String.format(
//                            "[%s-%d] 开始执行，线程: %s",
//                            taskType, taskId, Thread.currentThread().getName()));
//
//                        Thread.sleep(taskDurationMs);
//
//                        System.out.println(String.format(
//                            "[%s-%d] 执行完成", taskType, taskId));
//
//                    } catch (InterruptedException e) {
//                        Thread.currentThread().interrupt();
//                        System.out.println(String.format(
//                            "[%s-%d] 被中断", taskType, taskId));
//                    }
//                });
//                successCount++;
//            } catch (Exception e) {
//                rejectedCount++;
//                System.out.println(String.format(
//                    "[%s-%d] 任务被拒绝: %s", taskType, taskId, e.getClass().getSimpleName()));
//            }
//        }
//
//        System.out.println(String.format(
//            "*** %s 提交结果: 成功 %d 个, 被拒绝 %d 个 ***",
//            taskType, successCount, rejectedCount));
//
//        // 记录调整历史
//        if (rejectedCount > 0) {
//            ThreadPoolWebController.addAdjustmentHistory("WebExamplePool",
//                String.format("%s: %d个任务被拒绝", taskType, rejectedCount));
//        }
//    }
//
//    /**
//     * 打印当前状态
//     */
//    private static void printCurrentStatus() {
//        ThreadPoolMetrics metrics = executor.getCurrentMetrics();
//        System.out.println("\n=== 当前线程池状态 ===");
//        System.out.println(metrics.toString());
//        System.out.println(executor.getAdjustmentStats());
//        System.out.println("========================\n");
//
//        // 添加到Web历史记录
//        ThreadPoolWebController.addAdjustmentHistory("WebExamplePool",
//            String.format("状态检查: 核心=%d, 最大=%d, 活跃=%d, 队列=%d, 负载等级=%d",
//                metrics.getCorePoolSize(), metrics.getMaximumPoolSize(), metrics.getActiveThreads(),
//                metrics.getQueueSize(), metrics.getLoadLevel()));
//    }
//}